/**
 * 数组去重
 */
let arr = [1, 1, 2, 2, 3, 3, 4, 5]
//set
// console.log(Array.from(new Set(arr)))

//filter+indexof
function uniqueArr1(arr) {
    return arr.filter((item, index, arr) => {
        return arr.indexOf(item) === index
    })

}

// console.log('filter+indexof', uniqueArr1(arr))

//for+includes
function uniqueArr2(arr) {
    let res = []
    for (let i = 0; i < arr.length; i++) {
        if (!res.includes(arr[i])) {
            res.push(arr[i])
        }
    }
    return res
}

// console.log('for+splice', uniqueArr2(arr))

// 双for + splice
function uniqueArr3(arr) {
    for (let i = 0; i < arr.length; i++) {
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[j] === arr[i]) {
                arr.splice(j, 1)
                j--
            }
        }
    }
    return arr
}

// console.log('for+splice', uniqueArr3(arr))

//reduce
// reduce 常用的就两个参数 prev(回调函数前值) cur(数组当前值)
function uniqueArr4(arr) {
    return arr.reduce((prev, cur) => {
        prev.indexOf(cur) === -1 && prev.push(cur)
        return prev
    }, [])
}

console.log('reduce', uniqueArr4(arr))

//reduce运用
/*
arr.reduce(function(prev,cur,index,arr){
...
}, init);
arr 表示原数组；
prev 表示上一次调用回调时的返回值，或者初始值 init;  √
cur 表示当前正在处理的数组元素；   √
index 表示当前正在处理的数组元素的索引，若提供 init 值，则索引为0，否则索引为1；
init 表示初始值。
*/

// 数组累加
let arr1 = [1, 2, 3, 4, 5, 6]
let sum = arr1.reduce((prev, cur) => {
    return prev + cur
})
console.log(sum)  //21

//求数组最大值
let max = arr1.reduce((prev, cur) => {
    return Math.max(prev, cur)
})
console.log('max:', max)  //max: 6


// 二维数组扁平化
let arr2 = [[1, 2], [3, 4], 5]
let res = arr2.reduce((prev, cur) => {
    return prev.concat(cur)
}, [])
console.log('扁平化：', res)

//建立管道

function increment(input) {
    return input + 1;
}

function decrement(input) {
    return input - 1;
}

function double(input) {
    return input * 2;
}

function halve(input) {
    return input / 2;
}

// 需求是：有个订单需要先increment、double 和 decrement
let pipeline = [increment, double, decrement];
const order = pipeline.reduce((total, fun) => {
    return fun(total)
}, 8)
console.log('order', order)  //17
//从数组中获取对象
const apples = ['green', 'red', 'red', 'yellow', 'red', 'yellow', 'green', 'green'];
let appleMap = apples.reduce((prev, apple) => {
    if (prev[apple] >= 1) {
        prev[apple]++
    } else {
        prev[apple] = 1
    }
    return prev

}, {})
console.log('appleMap', appleMap)  //appleMap { green: 3, red: 3, yellow: 2 }
